/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao;
import entidades.Cidade;
import interfaces.IGerenciaCidade;
import javax.swing.JOptionPane;
import telas.TelaGerenciaCidade;
import java.util.ArrayList;
import controladoras.apresentacao.modelos.ModeloTabelaCidade;
import erros.ErroAtualizacao;

/**
 * Classe que implementa a controladora de interação de cidade.
 * @author thiagostuckert
 */
public class CntrIntCidade {
    /**
     * Atributo utilizado para a instanciação da controladora em questão.
     */
    private static CntrIntCidade ref;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na interface
     * de gerencia de cidade.
     */
    private IGerenciaCidade cntrGerenciaCidade;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de gerencia de cidade.
     */
    private TelaGerenciaCidade telaGerenciaCidade;
    /**
     * Atributo utilizado para a chamada dos metodos definidos no modelo
     * da tabela de gerencia de cidade.
     */
    private ModeloTabelaCidade modeloTabelaCidade;
    /**
     * Atributo utilizado para a apresentação de todas cidades já existentes.
     */
    private ArrayList listaCidades = new ArrayList();
    /**
     * Atributo utilizado para a edição das cidades já existentes.
     */
    private ArrayList cidadesParam = new ArrayList();

    /**
     * Metodo que atribui uma controladora a outra.
     * @param cntr controladora a ser atribuida.
     */
    public final void setCntrGerenciaCidade(final IGerenciaCidade cntr) {
        cntrGerenciaCidade = cntr;
    }

    /**
     * Metodo que dispara a apresentação a tela de gerencia de Cidade.
     */
    public final void mostrarTelaGerenciaCidade() {

        try {
           telaGerenciaCidade = TelaGerenciaCidade.instanciar();
           telaGerenciaCidade.setControladoraInteracao(this);
           modeloTabelaCidade = ModeloTabelaCidade.instanciar();
           cidadesParam = cntrGerenciaCidade.recuperarCidades();
           copiaLista();
           modeloTabelaCidade.setRows(cidadesParam);
           telaGerenciaCidade.setVisible(true);
        } catch (Exception e) {
           JOptionPane.showMessageDialog(telaGerenciaCidade,
                     e.getMessage());
        }

    }
    /**
     * Metodo que copia o conteudo de um ArrayList para outro.
     */
    public final void copiaLista() {
        for (int i = 0; i < cidadesParam.size(); i++) {
            Cidade cidade = new Cidade(
                    ((Cidade) cidadesParam.get(i)).getNomeCidade());
            listaCidades.add(cidade);
        }
    }

    /**
     * Metodo que instancia a contraladora de interação de cidade.
     * @return Controladora de interação de Cidade instanciada
     */
    public static CntrIntCidade instanciar() {
        if (ref == null) {
            ref = new CntrIntCidade();
        }
        return ref;
    }
    /**
     *
     * Metodo que fecha a tela de gerencia de cidade.
     */
    public final void encerrar() {
        telaGerenciaCidade.setVisible(false);
    }
    /**
    * Metodo que chama a controladora de negócio para a adição de cidade.
    * @param nomeCidade nome da cidade a ser adicionada
    */
    public final void addCidade(final String nomeCidade) {
        modeloTabelaCidade = ModeloTabelaCidade.instanciar();
        try {
            Cidade cidade = new Cidade(nomeCidade);
            cntrGerenciaCidade.cadastrarCidade(cidade);
            modeloTabelaCidade.addRow(cidade);
            JOptionPane.showMessageDialog(telaGerenciaCidade,
                     "Cidade Cadastrada com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaCidade,
                     e.getMessage());
        }
    }

    /**
     * Método que chama a controladora de negócio para a remoção de cidade.
     * @param linha linha da tabela onde está a cidade a ser removida.
     */
    public final void delCidade(final int linha) {
        modeloTabelaCidade = ModeloTabelaCidade.instanciar();
        try {
            Cidade cidade = new Cidade(
                    (String) modeloTabelaCidade.getValueAt(linha, linha));
            cntrGerenciaCidade.deletarCidade(cidade);
            modeloTabelaCidade.delRow(linha);
            JOptionPane.showMessageDialog(telaGerenciaCidade,
                     "Cidade Deletada com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaCidade,
                     e.getMessage());
        }
    }
    /**
     * Metodo que chama a controladora de negocio para atualização de cidade.
     * @param cidadeVelha Cidade a ter seus dados atualizados.
     * @param cidadeNova Cidade com os novos dados.
     * @throws erro é tratado pelo modelo da tabela.
     */
    public final void upCidade(final Cidade cidadeVelha,
            final Cidade cidadeNova) throws ErroAtualizacao{
        cntrGerenciaCidade.atualizarCidade(cidadeVelha, cidadeNova);
        JOptionPane.showMessageDialog(telaGerenciaCidade,
                     "Cidade alterada com sucesso");
    }
}
